java 关机钩使用

前言

在java中通过使用Runtime.getRuntime().addShutdownHook(Thread hook)方式,向JVM中注册一系列shutdownHook,当JVM关闭时,会一一调用注册的hook,通过利用这一特性,我们可以在钩子中做资源的回收和释放等操作。

使用示例

以下是jdk中java.util.logging.LogManager实现的部分代码:

public class LogManager {
static {
try {
Runtime.getRuntime().addShutdownHook(new Cleaner());
} catch (IllegalStateException e) {
// If the VM is already shutting down,
// We do not need to register shutdownHook.
}
}

//内部类(jvm退出时,做资源回收释放,状态为重置等操作)
private class Cleaner extends Thread {
public void run() {
LogManager mgr = manager;
synchronized (LogManager.this) {
deathImminent = true;
initializedGlobalHandlers = true;
}
// Do a reset to close all active handlers.
reset();
}
}
}

调用的场景

  1. 程序正常退出;
  2. 使用System.exit()退出;
  3. 终端控制台使用Ctrl+C触发的中断;
  4. 系统关闭;
  5. OutOfMemory引起的宕机;
  6. 使用Kill pid命令干掉进程(注:使用kill -9 pid强杀时,不会被调用);